#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define SYS_ERROR(msg,n) do {perror(msg);exit(n);} while(0)
#define PJD_ERROR(msg,n) do {fprintf(stderr,"%s\n",msg);exit(n);} while(0)

#include "pjd.h"

int
main(int argc, char* argv[])
{
    char* arquivo;
    char  this_host[256];
    int   porto;
    int   pjdd, fd;          /* descritores do protocolo e do arquivo */
    int   buflen;            /* maior mensagem sobre PJD */
    int   nrcvd;             /* no. de bytes recebidos de PJD */
    char  msg[MAX_PJD_MSG];  /* buffer para dados recebidos e escritos */
    if ((argc<2)||(argc>3)) {
        fprintf(stderr,"Uso correto: %s arquivo_destino [porto]\n", argv[0]);
        exit(1);
    }
//	char buffer [5];
//	buffer [0] = 'a';
//	buffer [1] = 'b';
//	buffer [2] = 'c';
//	buffer [3] = 'a';
//	buffer [4] = 'd';
//
//	windowPackage testePack(1, 10, 5, buffer);
//	char *pack;
//	int size = testePack.mountPackageToSend(&pack);
//	printf("--> Imprimindo no main \n");
//	for(int i = 0; i < size; i++)
//		printf("I: %d Valor: %d \n", i, pack[i]);
//
//	int returned = windowPackage::verifyPackage(pack, size);
//	if(returned)
//		printf("Validado !! \n");
//	else
//		printf("NAO Validado !! \n");
//
//	windowPackage *receivedPack = NULL;
//	receivedPack = windowPackage::mountPackageToReceive(pack, size);
//
//	receivedPack->printWindowPackage();



//	testePack.printPackage();


    arquivo = argv[1];

    porto =(argc==3)? atoi(argv[2]) : 0;


    if ((fd=open(arquivo,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))<0)
        SYS_ERROR("open",2);
    if ((porto=pjd_init(porto))<0)
        PJD_ERROR("pjd_init",3);
    if (gethostname(this_host,sizeof(this_host))<0)
        SYS_ERROR("gethostname",4);

    printf("Recebendo arquivo %s pelo porto %d do host %s\n",
            arquivo, porto, this_host);

    if ((buflen=pjd_mtu())<0)
        PJD_ERROR("pjd_mtu",5);
    if ((pjdd=pjd_passivo())<0)
        PJD_ERROR("pjd_passivo",6);

    while ( (nrcvd=pjd_recv(pjdd,msg,buflen))>0 )
        if (write(fd,msg,nrcvd)< nrcvd)
            SYS_ERROR("write",7);

    if (nrcvd<0)
        PJD_ERROR("pjd_recv",8);

    pjd_close(pjdd);
    close(fd);
}

